﻿<!DOCTYPE html>
<html>
<head lang="zh-cn">
    <meta charset="utf-8" />
    <!--Let browser know website is optimized for mobile-->
    <title>在app.config文件中使用自己的配置</title>
    <!-- Compiled and minified CSS -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" type="text/css" href="../../assets/materialize-v0.97.5/css/materialize.min.css" media="screen,projection" />
    <link rel="stylesheet" type="text/css" href="../../assets/rainbow/themes/github.css" media="screen" />
    <link rel="stylesheet" type="text/css" href="../../assets/com/css/bianma8.css" />
</head>
<body class="grey lighten-3">
    <header class="teal lighten-3">
        <div class="nav-wrapper">
            <div class="row">
                <div class="col s6">
                    <a class="page-title white-text" href="#">
                        编码吧，程序君！
                    </a>
                </div>
            </div>
        </div>
        <!-- Dropdown Structure -->
        <ul id="dropdown2" class="dropdown-content">
            <li><a href="#one">one</a></li>
            <li><a href="#two">two</a></li>
            <li class="divider"></li>
            <li><a href="#!">three</a></li>
        </ul>
        <ul id="dropdown1" class="dropdown-content">
            <li><a href="#one">one</a></li>
            <li><a href="#two">two</a></li>
            <li class="divider"></li>
            <li><a href="#!">three</a></li>
        </ul>
        <nav>
            <div class="nav-wrapper teal lighten-2">
                <div class="nav-wrapper">
                    <ul class="left hide-on-med-and-down">
                        <li><a href="sass.html">Sass</a></li>
                        <li><a class="dropdown-button" href="#!" data-activates="dropdown2">Components</a></li>
                        <!-- Dropdown Trigger -->
                        <li><a class="dropdown-button" href="#!" data-activates="dropdown1">Dropdown</a></li>
                    </ul>
                    <ul class="right hide-on-med-and-down">
                        <li><a href="sass.html">Sass</a></li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <main>
        <div class="nav-wrapper row">
            <div class="col m2 l2 card-panel">
            </div>
            <div class="col m8 l8 card-panel">
                <a href="#">
                    <h1>在app.config文件中使用自己的配置</h1>
                </a>
                <div class="row">
                    <div class="col s12 m6 l6 grey-text text-darken-1">
                        作者：ly.jaeho
                        时间：2016年03月03日
                    </div>
                </div>
                <div id="s1" class="scrollspy">
                    <h1>1 引言</h1>
                    <p>
                        在项目开发过程中使用配置文件是常事，一些简单的配置我们可以通过在app.config中通过appSettings节点进行配置，数据库连接字符串可以通过在connectionStrings节点下进行配置。那么除了使用框架中提供的这两个配置方式，还有什么配置方法了。
                    </p>
                    <p>
                        下面我们来看一下log4net的配置文件编写片段。
                    </p>
                    <ul class="collapsible no-shadow" data-collapsible="expandable">
                        <li>
                            <div class="collapsible-header active">Code</div>
                            <div class="collapsible-body">
<pre>
<code data-language="html">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;configuration&gt;
  &lt;configSections&gt;
    &lt;section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /&gt;
  &lt;/configSections&gt;
  &lt;log4net&gt;
    &lt;!--定义输出到文件中--&gt;
    &lt;appender name="LogFileAppender"  type="log4net.Appender.RollingFileAppender,log4net"&gt;
      &lt;!--定义文件存放位置--&gt;
      &lt;file value="log4net.log" /&gt;
      &lt;appendToFile value="true" /&gt;
      &lt;rollingStyle value="Date" /&gt;
      &lt;datePattern value="yyyyMMdd-HH:mm:ss" /&gt;
      &lt;layout type="log4net.Layout.PatternLayout"&gt;
    &lt;/appender&gt;
  &lt;/log4net&gt;
&lt;/configuration&gt;
</code>
</pre>
                            </div>
                        </li>
                    </ul>
                    <p>
                        我们看见在配置文件中出现了一个log4net的节点，在节点下定义了log4net的配置信息。那么我们如何在app.config文件中自定义自己的配置信息了。下面让我们一起来了解吧。
                    </p>
                </div>
                <div id="s2" class="scrollspy">
                    <h1>2 快速开始</h1>
                    <p>创建项目，新建一个console application和一个library。</p>
                    <p>参见源代码xS1部分。</p>
                </div>
                <div id="s2x1" class="scrollspy">
                    <h2>
                        2.1 修改配置文件
                    </h2>
                    <p>在app.config中加入配置信息。</p>
                    <ul class="collapsible no-shadow" data-collapsible="expandable">
                        <li>
                            <div class="collapsible-header active">Code</div>
                            <div class="collapsible-body">
<pre>
<code data-language="html">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;configuration&gt;
  &lt;configSections&gt;
    &lt;section name="moduleX" type="ModuleX.XConfigSection,ModuleX"/&gt;
  &lt;/configSections&gt;
  &lt;moduleX version="1.0"/&gt;
&lt;/configuration&gt;
</code>
</pre>
                            </div>
                        </li>
                    </ul>
                    <p>
                        section节点定义了我们自己的配置信息。
                        name属性的值需要和下面具体的配置节点名称对应，
                        type属性的值是我们自定义的配置节点typename。
                    </p>
                    <p>moduleX节点就是我们自己的配置信息了，它的属性和结构是我们设计的。</p>
                </div>
                <div id="s2x2" class="scrollspy">
                    <h2>2.2 创建配置类</h2>
                    <p>
                        引用System.Configuration程序集，新建类XConfigSection继承System.Configuration.ConfigurationSection。在类XConfigSection中定义属性。
                    </p>
                    <ul class="collapsible no-shadow" data-collapsible="expandable">
                        <li>
                            <div class="collapsible-header active">Code</div>
                            <div class="collapsible-body">
<pre>
<code data-language="csharp">[ConfigurationProperty("version")]
public string VersionProperty
{
    get { return (string)this["version"]; }
    set { this["version"] = value; }
}
</code>
</pre>
                            </div>
                        </li>
                    </ul>
                </div>
                <div id="s2x3" class="scrollspy">
                    <h2>
                        2.3 读取配置数据
                    </h2>
                    <p>调用System.Configuration.ConfigurationManager来获取我们自己定义的section信息，的从配置信息中获取数据。</p>
                    <ul class="collapsible no-shadow" data-collapsible="expandable">
                        <li>
                            <div class="collapsible-header active">Code</div>
                            <div class="collapsible-body">
<pre>
<code data-language="csharp">private static XConfigSection s_current;
public static XConfigSection Current
{
    get
    {
        if (s_current == null)
        {
            s_current = (XConfigSection)ConfigurationManager.GetSection("moduleX");
        }
        return s_current;
    }
}
</code>
</pre>
                            </div>
                        </li>
                    </ul>
                </div>
                <div id="s3" class="scrollspy">
                    <h1>
                        3 使用独立配置文件
                    </h1>
                    <p>通过上面的简单代码我们实现了在app.config中添加自己的配置信息的目标。但是app.config自身可以配置的内容就非常的多，如果再加上我们的配置内容app.config文件就显得太臃肿了。</p>
                    <p>
                        那么如何将自己的配置部分单独定义在一个配置文件中呢？
                    </p>
                    <p>
                        我们需要用到ConfigurationManager.OpenMappedExeConfiguration方法来加载配置文件。
                    </p>
                    <ul class="collapsible no-shadow" data-collapsible="expandable">
                        <li>
                            <div class="collapsible-header active">Code</div>
                            <div class="collapsible-body">
<pre>
<code data-language="csharp">ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "";
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
</code>
</pre>
                            </div>
                        </li>
                    </ul>
                    <p>现在的我们需要提供设置配置文件的路径的方法。</p>
                </div>
                <div id="s3x1" class="scrollspy">
                    <h2>3.1 通过appSettings来配置</h2>
                    <p>用户在app.config文件的Appsettings中通过固定的key来设置。</p>
                </div>
                <div id="s3x2" class="scrollspy">
                    <h2>3.2 通过Assembly.cs来配置</h2>
                    <p>开发一个attribute，让使用者在Assembly.cs文件中通过下面的代码来配置。
                    </p>
                </div>

                <div class="row">
                    <a href="#">上一篇:xxxxxxx</a>
                </div>
                <div class="row">
                    <a href="#">下一篇:在app.config文件中使用自己的配置-使用系统自带类型</a>
                </div>
            </div>
            <div class="col show-on-large m2 l2">
                <div class="toc-wrapper">
                    <h5>目录</h5>
                    <ul class="section table-of-contents">
                        <li>
                            <a href="#s1">1 引言</a>
                        </li>
                        <li>
                            <a href="#s2">2 快速开始</a>
                        </li>
                        <li>
                            <a href="#s2x1">2.1 修改配置文件</a>
                        </li>
                        <li>
                            <a href="#s2x2">2.2 创建配置类</a>
                        </li>
                        <li>
                            <a href="#s2x3">2.3 读取配置数据</a>
                        </li>
                        <li>
                            <a href="#s3">3 使用独立配置文件</a>
                        </li>
                    </ul>
                </div>
            </div>
        </div>
    </main>
    <footer class="page-footer">
        <div class="container">
            <div class="row">
                <div class="col l6 s12">
                    <h5 class="white-text">Footer Content</h5>
                    <p class="grey-text text-lighten-4">You can use rows and columns here to organize your footer content.</p>
                </div>
                <div class="col l4 offset-l2 s12">
                    <h5 class="white-text">Links</h5>
                    <ul>
                        <li><a class="grey-text text-lighten-3" href="#!">Link 1</a></li>
                        <li><a class="grey-text text-lighten-3" href="#!">Link 2</a></li>
                        <li><a class="grey-text text-lighten-3" href="#!">Link 3</a></li>
                        <li><a class="grey-text text-lighten-3" href="#!">Link 4</a></li>
                    </ul>
                </div>
            </div>
        </div>
        <div class="footer-copyright">
            <div class="container">
                © 2014 Copyright Text
                <a class="grey-text text-lighten-4 right" href="#!">More Links</a>
            </div>
        </div>
    </footer>
    <!-- Compiled and minified JavaScript -->
    <script src="../../assets/jquery/jquery-2.1.1.min.js">
    </script>
    <script src="../../assets/materialize-v0.97.5/js/materialize.min.js">
    </script>
    <script src="../../assets/rainbow/js/rainbow.js">
    </script>
    <script src="../../assets/rainbow/js/language/html.js">
    </script>
    <script src="../../assets/rainbow/js/language/csharp.js">
    </script>
    <script>
        $(document).ready(function () {
        $('.toc-wrapper').pushpin({ top: 180 });

        $('.scrollspy').scrollSpy();

        $(".dropdown-button").dropdown();
        });

    </script>
</body>
</html>
